import com.ridgesoft.intellibrain.IntelliBrain;
import javax.comm.SerialPort;
import java.io.*;
import java.lang.*;

public class GPS{
	boolean checkGPS = false;
	char stream;
	char byteArray[] = new char[100];
	char gpsArray[] = new char[100];
	String currentLocation = "", coord1, Btm;
	InputStream input;
	LCD d;
	int numByte = 0, h = 0, i = 0, j = 0, k = 0, length;
	//LCD lcd = new LCD();
	
	public GPS() 
	{
		init();
	}
	public GPS (LCD l){
		d = l;
		init();
	}
	public void init()
	{	
		try{
            SerialPort comPort = IntelliBrain.getCom1();
			input = comPort.getInputStream();
            comPort.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
		} catch (Exception e){
			e.printStackTrace();
		}
	}
	
	/*
	 * Updates the GPS's currentLocation variable. To get the variable use String getLocation();
	 */
	public String updateLocation(){
		for(i = 0; i < 99; i++){
			byteArray[i] = ' ';
		}
		for(i = 0; i < 99; i++){
			gpsArray[i] = ' ';
		}
		h = 0;
		i = 0;
		j = 0;
		k = 0;
		checkGPS = false;
		try{
			while(true){
				stream = (char)input.read();
				if(stream == '$')
					break;
			}			
			
			numByte = input.available();
			for(i = 0; i < numByte; i++){
				byteArray[i] = (char)input.read();
			}						
		} catch(Exception e){
			d.printTop("EXCEPTION");
			d.printBtm("");
		}
		try{
			for(i = 0; i < numByte; i++){
				if(byteArray[i] == 'G'){
					i++;
					if(byteArray[i] == 'P'){
						i++;
						if(byteArray[i] == 'G'){
							i++;
							if(byteArray[i] == 'G'){
								i++;
								if(byteArray[i] == 'A'){
									i++;
									if(i <= (numByte - 32)){
										checkGPS = true;
										for(j = i; j < numByte; j++){
											gpsArray[k] = byteArray[j];
											k++;
										}
										break;
									}
									else
										break;
								}
							}
						}
					}
				}
			}
			
//			d.printTop("" + gpsArray[7] + gpsArray[8] + gpsArray[9] + gpsArray[10] + gpsArray[11] + gpsArray[12] + gpsArray[13] + gpsArray[14] + gpsArray[15] + gpsArray[16] + gpsArray[17] + gpsArray[18] + gpsArray[19] + gpsArray[20] + gpsArray[21] + gpsArray[22]);
//			d.printBtm("" + gpsArray[23] + gpsArray[24] + gpsArray[25] + gpsArray[26] + gpsArray[27] + gpsArray[28] + gpsArray[29] + gpsArray[30] + gpsArray[31] + gpsArray[32] + gpsArray[33] + gpsArray[34] + gpsArray[35] + gpsArray[36] + gpsArray[37] + gpsArray[38]);
//			Thread.sleep(3000);
			
			if(!checkGPS){
				currentLocation = "";
				d.printTop("GPS Raw Data:");
				d.printBtm("Not GPGGA String");
				Thread.sleep(3000);
			}
			else
				if(gpsArray[8] == '4' && gpsArray[9] == '5' && gpsArray[10] == '4' && gpsArray [11] == '0')
					if(gpsArray[20] == '1' && gpsArray[21] == '1' && gpsArray[22] == '1' && gpsArray [23] == '0' && gpsArray [24] == '2')
						for(h = 0; h < 100; h++){
							currentLocation += gpsArray[h];
						}
			input.close();
		}catch(Exception e){
			d.printTop("EXCEPTION");
			d.printBtm("");
		}
		
		return currentLocation;
	}
	
	private void waitForByte(){
		try{
			while(true){
				numByte = input.available();
				if(numByte > 0)
					break;
				else
					continue;
			}
		}catch(Exception e){
			d.printTop("EXCEPTION");
			d.printBtm("");
		}
	}
	
	public String getLocation(){
			return this.currentLocation;			

	}
	
}

